package com.czxy.web.servlet;

import cn.itcast.servlet.BaseServlet;
import cn.itcast.vcode.VerifyCode;
import com.czxy.domain.User;
import com.czxy.service.UserService;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;

@WebServlet("/userServlet")
public class UserServlet extends BaseServlet {

    private UserService userService = new UserService();

    /**
     * 根据用户名查询
     *
     * @return
     */
    public String findByUserName() {
        //1.接受参数
        String userName = getRequest().getParameter("userName");
        //2.调用service 获取数据
        List<User> list = userService.findByUserName(userName);
        //3.把数据存储到request域中
        getRequest().setAttribute("list", list);
        getRequest().setAttribute("userName", userName);
        //4.请求转发给list.jsp
        return "/user/list.jsp";
    }


    /**
     * 查询所有
     *
     * @return
     * @throws IOException
     */
    public String findAll() throws IOException {
        List<User> list = userService.findAll();
        getRequest().setAttribute("list", list);
        return "/user/list.jsp";
    }

    /**
     * 添加功能, 成功就到查询所有,失败就回到添加页面
     *
     * @return
     * @throws IOException
     */
    public String add() throws IOException {

        //1.接受参数
        User user = toBean(User.class);
        //2.调用service 得到添加结果
        boolean rel = userService.add(user);

        //3.根据结果给出响应
        if (rel) {
            // 添加成功 重定向到查询所有
            return "redirect:/userServlet?method=findAll";
        } else {
            // 添加失败 请求转发 提示错误信息和回显
            getRequest().setAttribute("addMsg", "添加失败,登录名重复");
            getRequest().setAttribute("user", user);
            return "/user/add.jsp";
        }


    }

    /**
     * 删除
     *
     * @return
     * @throws IOException
     */
    public String delById() throws IOException {
        //1.获取参数
        String id = getRequest().getParameter("id");
        //2.删除
        userService.delById(id);
        //3.重定向
        return "redirect:/userServlet?method=findAll";


    }

    public void upd() throws IOException {
        getResponse().getWriter().write("完成了  修改  功能 ");
    }


    /**
     * 获取验证码
     *
     * @throws IOException
     */
    public void getVcImg() throws IOException {

        VerifyCode vc = new VerifyCode();
        // 获取验证码图片
        BufferedImage image = vc.getImage();
        // 获取验证码 码值
        String vcCode = vc.getText();
        System.out.println("验证码:" + vcCode);
        // 码值存入session
        getSession().setAttribute("vcCode", vcCode);
        // 给前端响应
        VerifyCode.output(image, getResponse().getOutputStream());

    }

    /**
     * 校验验证码
     *
     * @param vcText
     * @return
     */
    public boolean checkVC(String vcText) {
        //1.获取session中的vcCode
        Object vcCode = getSession().getAttribute("vcCode");
        if (vcCode == null || vcText == null || vcText.equals("")) {
            return false;
        }
        //2.删除session 中的vcCode
        getSession().removeAttribute("vcCode");
        //3.校验 返回结果
        if (vcText.equalsIgnoreCase((String) vcCode)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 登录逻辑, 成功则到 欢迎页面, 失败则到登录页面
     *
     * @return
     */
    public String login() throws UnsupportedEncodingException {

        //1.获取前端传递的参数
        User user = toBean(User.class);

        // ----------验证码校验逻辑  开始--------------------
        // 获取前端传递的验证码
        String vcText = getRequest().getParameter("vcText");

        // 完成校验, 校验失败则直接提示,并且后续逻辑无需再走
        boolean rel = checkVC(vcText);
        if (rel == false) {
            getRequest().setAttribute("msg", "登录失败,验证码错误");
            return "/login/login.jsp";
        }
        // ----------验证码校验逻辑  结束--------------------


        //2.调用Service 执行登录逻辑 获取登录结果
        User loginU = userService.login(user);
        //3.根据结果 给出不同的响应
        if (loginU == null) {
            // 登录失败了
            // 把登陆失败的信息存储到request域中  请求转发给 index.jsp
            getRequest().setAttribute("msg", "登录失败,用户名密码错误");
            return "/login/login.jsp";
        } else {
            //登录成功了
            // 登录成功 则 把loginU 存储到session 域中, 把请求重定向到 welcome.jsp
            getSession().setAttribute("loginU", loginU);

            //----------- 记住用户名逻辑 开始-----------
            doRememberMe(user);
            //----------- 记住用户名逻辑 结束-----------
            //-----------自动登录  开始---------------
            doAutoLogin(user);
            //-----------自动登录  结束---------------

            return "redirect:/login/home.jsp";
        }
    }

    /**
     * 自动登录判断逻辑
     *
     * @param user
     * @throws UnsupportedEncodingException
     */
    private void doAutoLogin(User user) throws UnsupportedEncodingException {

        //1.获取自动登录的复选框 是否勾选
        String autoLogin = getRequest().getParameter("autoLogin");
        //2.把用户名和密码 存储到一个cookie中
        String username = URLEncoder.encode(user.getLoginName(), "UTF-8");
        String password = URLEncoder.encode(user.getLoginPwd(), "UTF-8");
        Cookie ck = new Cookie("autoInfo", username + "@" + password);
        //3.判断如果勾选了 就给cookie设置生命周期为7天, 否则为0
        if ("on".equals(autoLogin)) {
            ck.setMaxAge(60 * 60 * 24 * 7);
        } else {
            ck.setMaxAge(0);
        }

        //4.把cookie添加到响应头
        getResponse().addCookie(ck);
    }

    /**
     * 记住用户名  逻辑
     *
     * @param user
     * @throws UnsupportedEncodingException
     */
    public void doRememberMe(User user) throws UnsupportedEncodingException {
        // 1.获取是否勾选了 记住用户名,
        String rememberMe = getRequest().getParameter("rememberMe");

        // 2.如果勾选了 把用户名和密码以及勾选状态存储到cookie中 设置生命周期为 5 分钟  把cookie响应给前端
        //  如果没有勾选,则设置这几个cookie的生命周期为0
        String username = URLEncoder.encode(user.getLoginName(), "UTF-8");
        String password = URLEncoder.encode(user.getLoginPwd(), "UTF-8");
        Cookie ck1 = new Cookie("username", username);
        Cookie ck2 = new Cookie("password", password);

        Cookie ck3 = null;
        if ("on".equals(rememberMe)) {
            // 勾选了
            ck3 = new Cookie("RMsta", "1");
            ck1.setMaxAge(60 * 5);
            ck2.setMaxAge(60 * 5);
            ck3.setMaxAge(60 * 5);
        } else {
            // 未勾选
            ck3 = new Cookie("RMsta", "0");
            ck1.setMaxAge(0);
            ck2.setMaxAge(0);
            ck3.setMaxAge(0);
        }
        getResponse().addCookie(ck1);
        getResponse().addCookie(ck2);
        getResponse().addCookie(ck3);

    }

    /**
     * 登录逻辑, 成功则到 欢迎页面, 失败则到登录页面
     *
     * @return
     */
    public String login0() {

        //1.获取前端传递的参数
        User user = toBean(User.class);

        // ----------验证码校验逻辑  开始--------------------
        // 获取前端传递的验证码
        String vcText = getRequest().getParameter("vcText");
        // 完成校验, 校验失败则直接提示,并且后续逻辑无需再走
        boolean rel = checkVC(vcText);
        if (rel == false) {
            getRequest().setAttribute("msg", "登录失败,验证码错误");
            return "/login/login.jsp";
        }
        // ----------验证码校验逻辑  结束--------------------


        //2.调用Service 执行登录逻辑 获取登录结果
        User loginU = userService.login(user);
        //3.根据结果 给出不同的响应
        if (loginU == null) {
            // 登录失败了
            // 把登陆失败的信息存储到request域中  请求转发给 index.jsp
            getRequest().setAttribute("msg", "登录失败,用户名密码错误");
            return "/login/login.jsp";
        } else {
            //登录成功了
            // 登录成功 则 把loginU 存储到session 域中, 把请求重定向到 welcome.jsp
            getSession().setAttribute("loginU", loginU);
            return "redirect:/login/home.jsp";
        }
    }
}